﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;


namespace estiglp1112_5479_csharp_rec
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        /**
         * Preenche a base de dados
         */
        private void buttonBD_Click(object sender, EventArgs e)
        {
            this.textBox_Resultados.AppendText("A preencher a base de dados. Por favor aguarde!\n");
            this.textBox_Resultados.Update();
            csv2db obj = new csv2db();
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            obj.createDataBase();
            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            string feedback = string.Format("Tempo necessário para preencher a base de dados: {0}.\n", elapsedTime);
            this.textBox_Resultados.AppendText(feedback);
            this.textBox_Resultados.Update();
        }

        /**
         * Calcula a estatistica 1
         */
        private void estatistica1_Click(object sender, EventArgs e)
        {

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            this.textBox_Resultados.Clear();
            this.textBox_Resultados.Update();

            statistics obj = new statistics();

            var resultados = obj.stat1();

            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            this.textBox_tempo_total.Clear();
            this.textBox_tempo_total.AppendText(elapsedTime);
            this.textBox_tempo_total.Update();

            foreach (string resultado in resultados)
            {
                this.textBox_Resultados.AppendText(resultado);
            }
            this.textBox_Resultados.Update();


        }

        /**
         * activa o botão da estatistica 2 ao escolher o ano
         */
        private void comboBoxAnos_s2_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.estatistica2.Enabled = true;
        }

        /**
         * calcula a estatistica 2
         */
        private void estatistica2_Click(object sender, EventArgs e)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            this.textBox_Resultados.Clear();
            this.textBox_Resultados.Update();

            statistics obj = new statistics();

            int ano = int.Parse(this.comboBoxAnos_s2.SelectedItem.ToString());

            this.estatistica2.Enabled = false;

            var resultados = obj.stat2(ano);

            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            this.textBox_tempo_total.Clear();
            this.textBox_tempo_total.AppendText(elapsedTime);
            this.textBox_tempo_total.Update();
            this.textBox_tempo_ano.Clear();
            this.textBox_tempo_ano.AppendText(elapsedTime);
            this.textBox_tempo_ano.Update();

            foreach (string resultado in resultados)
            {
                this.textBox_Resultados.AppendText(resultado);    
            }
            this.textBox_Resultados.Update();
        }

        /**
         * Actualiza a combobox das escolas consoante o ano escolhido
         */
        private void comboBoxAnos_3_SelectedIndexChanged(object sender, EventArgs e)
        {
            int ano = int.Parse(this.comboBoxAnos_3.SelectedItem.ToString());

            statistics obj = new statistics();

            var escolas = obj.escolasDoAno(ano);
            foreach (string escola in escolas)
            {
                this.comboBox_s3_escolas.Items.Add(escola);
            }

            this.comboBox_s3_escolas.Enabled = true;
            
        }

        /**
         * activa o botão da estatistica 3 após escolher a escola
         */
        private void comboBox_s3_escolas_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.estatistica3.Enabled = true;
        }

        /**
         * Calcula a estatistica 3
         */
        private void estatistica3_Click(object sender, EventArgs e)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            this.textBox_Resultados.Clear();
            this.textBox_Resultados.Update();

            int ano = int.Parse(this.comboBoxAnos_3.SelectedItem.ToString());

            string escola = this.comboBox_s3_escolas.SelectedItem.ToString();

            statistics obj = new statistics();

            var resultados = obj.stat3(ano, escola);

            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            this.textBox_tempo_total.Clear();
            this.textBox_tempo_total.AppendText(elapsedTime);
            this.textBox_tempo_total.Update();
            this.textBox_tempo_ano.Clear();
            this.textBox_tempo_ano.AppendText(elapsedTime);
            this.textBox_tempo_ano.Update();

            this.comboBox_s3_escolas.Items.Clear();
            this.comboBox_s3_escolas.Enabled = false;
            this.estatistica3.Enabled = false;

            foreach (string resultado in resultados)
            {
                this.textBox_Resultados.AppendText(resultado);
                this.textBox_Resultados.Update();
            }

        }
        
        /**
         * Calcula a estatistica 2 para todos os anos
         */
        private void estatistica2_1_Click(object sender, EventArgs e)
        {
            this.textBox_Resultados.Clear();
            this.textBox_Resultados.AppendText("Pode demorar alguns segundos, por favor aguarde!\n");
            this.textBox_Resultados.Update();

            statistics obj = new statistics();
            List<string> calculos = new List<string>();

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            for (int ano = 2000; ano < 2011; ano++)
            {
                string feedback = string.Format("Calculando para o ano: {0}.\n", ano);
                this.textBox_Resultados.AppendText(feedback);
                this.textBox_Resultados.Update();

                Stopwatch stopWatch2 = new Stopwatch();
                stopWatch2.Start();
                var resultados = obj.stat2(ano);
                stopWatch2.Stop();
                // Get the elapsed time as a TimeSpan value.
                TimeSpan ts2 = stopWatch2.Elapsed;
                string elapsedTime2 = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts2.Hours, ts2.Minutes, ts2.Seconds,
                    ts2.Milliseconds / 10);
                this.textBox_tempo_ano.Clear();
                this.textBox_tempo_ano.AppendText(elapsedTime2);
                this.textBox_tempo_ano.Update();

                foreach (string resultado in resultados)
                {
                    calculos.Add(resultado);
                }

                calculos.Add("\n");
            }

            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            this.textBox_tempo_total.Clear();
            this.textBox_tempo_total.AppendText(elapsedTime);
            this.textBox_tempo_total.Update();

            this.textBox_Resultados.AppendText("\n");
            this.textBox_Resultados.Clear();
            this.textBox_Resultados.Update();
            
            foreach (string calculo in calculos)
            {
                this.textBox_Resultados.AppendText(calculo);
            }

            this.textBox_Resultados.Update();
        }

        /**
         * Calcula a estatistica 3 para todos os anos e escolas
         */
        private void estatistica3_1_Click(object sender, EventArgs e)
        {
            this.textBox_Resultados.Clear();
            this.textBox_Resultados.AppendText("Pode demorar alguns minutos, por favor aguarde!\n");
            this.textBox_Resultados.Update();

            List<string> calculos = new List<string>();

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            for (int ano = 2000; ano < 2011; ano++)
            {
                string feedback = string.Format("Calculando para o ano: {0}.\n", ano);
                this.textBox_Resultados.AppendText(feedback);
                this.textBox_Resultados.Update();
                statistics obj = new statistics();

                Stopwatch stopWatch2 = new Stopwatch();
                stopWatch2.Start();
                var escolas = obj.escolasDoAno(ano);
                
                foreach (string escola in escolas)
                {
                    var resultados = obj.stat3(ano, escola);                    

                    foreach (string resultado in resultados)
                    {
                        calculos.Add(resultado);
                    }

                    calculos.Add("\n");
                }
                calculos.Add("\n");
                stopWatch2.Stop();
                // Get the elapsed time as a TimeSpan value.
                TimeSpan ts2 = stopWatch2.Elapsed;
                string elapsedTime2 = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                    ts2.Hours, ts2.Minutes, ts2.Seconds,
                    ts2.Milliseconds / 10);
                this.textBox_tempo_ano.Clear();
                this.textBox_tempo_ano.AppendText(elapsedTime2);
                this.textBox_tempo_ano.Update();
            }

            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            this.textBox_tempo_total.Clear();
            this.textBox_tempo_total.AppendText(elapsedTime);
            this.textBox_tempo_total.Update();

            this.textBox_Resultados.AppendText("Calculos efectuados. A preparar resultados!\n");
            this.textBox_Resultados.Update();

            foreach (string calculo in calculos)
            {
                this.textBox_Resultados.AppendText(calculo);     
            }
            this.textBox_Resultados.Update();
        }

        /**
         * limpa as text box's
         */
        private void Limpar_Click(object sender, EventArgs e)
        {
            this.textBox_Resultados.Clear();
            this.textBox_Resultados.Update();
            this.textBox_tempo_total.Clear();
            this.textBox_tempo_total.Update();
            this.textBox_tempo_ano.Clear();
            this.textBox_tempo_ano.Update();
        }
    }
}
